package com.hejiale.lease.common.result;

import lombok.Data;

/**
 * 全局统一返回结果类
 */
@Data
public class Result<T> {

    // 返回码
    private Integer code;

    // 返回消息
    private String message;

    // 返回数据
    private T data;

    /**
     * 无参构造函数
     */
    public Result() {
    }

    /**
     * 构建一个带有数据的 Result 对象
     *
     * @param data 返回的数据
     * @param <T>  数据的类型
     * @return 包含数据的 Result 对象
     */
    private static <T> Result<T> build(T data) {
        Result<T> result = new Result<>();
        if (data != null)
            result.setData(data);
        return result;
    }

    /**
     * 构建一个带有数据和结果枚举的 Result 对象
     *
     * @param body           返回的数据
     * @param resultCodeEnum 结果枚举，包含状态码和消息
     * @param <T>            数据的类型
     * @return 包含数据、状态码和消息的 Result 对象
     */
    public static <T> Result<T> build(T data, ResultCodeEnum resultCodeEnum) {
        Result<T> result = build(data);
        result.setCode(resultCodeEnum.getCode());
        result.setMessage(resultCodeEnum.getMessage());
        return result;
    }

    /**
     * 构建一个表示成功的 Result 对象
     *
     * @param data 返回的数据
     * @param <T>  数据的类型
     * @return 表示成功的 Result 对象
     */
    public static <T> Result<T> ok(T data) {
        return build(data, ResultCodeEnum.SUCCESS);
    }

    /**
     * 构建一个表示成功的 Result 对象（无数据）
     *
     * @param <T> 数据的类型
     * @return 表示成功的 Result 对象
     */
    public static <T> Result<T> ok() {
        return Result.ok(null);
    }

    /**
     * 构建一个表示失败的 Result 对象
     *
     * @param <T> 数据的类型
     * @return 表示失败的 Result 对象
     */
    public static <T> Result<T> fail() {
        return build(null, ResultCodeEnum.FAIL);
    }

    /**
     * 通过code和message构建一个表示失败的 Result 对象
     * @param code
     * @param message
     * @return
     * @param <T>
     */
    public static <T> Result<T> fail(Integer code, String message) {
        Result<T> result = build(null);
        result.setCode(code);
        result.setMessage(message);
        return result;
    }
}
